const Koa = require('koa')
// 因为socket.io不能直接把koa服务转成基于websocket协议的
const Http = require('http')
const SocketIo = require('socket.io')

const app = new Koa()
const server = Http.createServer(app.callback())

const io = SocketIo(server, {
  path: '/socket'
})
// 聊天室：构造一个用户ID和socketId的映射
//每个人加入到聊天室，都会生成一个socket实例
//构造一个聊天室对象，每个人加入到聊天室的时候手动把这个socket实例的id放到聊天室，
const ioMap = {}
io.on('connection', socket => {
  // 先拿到用户Id
  const {userId} = socket.handshake.query
  if(!userId) {
    socket.disconnect()
  }
  console.log(userId + '连接成功了，您已经成功加入到聊天室')
  ioMap[userId] = socket.id
  //处理心跳检测的
  socket.on('ping', () => {
    socket.emit('pang')
  })
  // 处理客户端发送消息
  socket.on('send', (obj) => {
    //拿到消息，要根据接收人指定发送给某人
    console.log('服务端拿到我的消息了，消息是', obj)
    const toId = obj.toId
    // 如果有toId，说明我要指定发送给某人,怎么发送，通过触发事件发送到客户端，触发的事件是客户端注册的
    if(toId) {
      socket.to(ioMap[toId]).emit('recive', obj)
    } else {
      console.log('群发消息了')
      // socket.emit('recive', obj)
      // 群发消息，除了发送的这个scokcet之外的所有socket都能接收到消息
      socket.broadcast.emit('recive', obj)
    }
  })
  // 处理连接关闭之后，把人从聊天室中踢掉
  socket.on('disconnect', () => {
    console.log(socket.id, '断开连接了')
    for (const key in ioMap) {
      if (Object.prototype.hasOwnProperty.call(ioMap, key)) {
        const element = ioMap[key];
        if(element === socket.id) {
          delete ioMap[key]
        }
      }
    }
  })
  console.log(ioMap)
})

server.listen(3000)




